From e1290b1524218d977a98825c8cec8c2cc12427ef Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Thu, 5 Apr 2007 10:43:50 +0100 Subject: [PATCH] linux: simplify and perform checking of multicall status Signed-off-by: Jan Beulich --- .../arch/i386/mm/hypervisor.c | 8 +++---- .../drivers/xen/core/machine_kexec.c | 1 - .../drivers/xen/netfront/netfront.c | 6 +++-- .../include/asm-i386/mach-xen/asm/hypercall.h | 2 +- .../asm-i386/mach-xen/asm/hypervisor.h | 2 +- .../include/asm-ia64/hypervisor.h | 2 +- .../asm-x86_64/mach-xen/asm/hypercall.h | 2 +- linux-2.6-xen-sparse/include/xen/hvm.h | 1 - linux-2.6-xen-sparse/include/xen/hypercall.h | 24 +++++++++++++++++++ 9 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 linux-2.6-xen-sparse/include/xen/hypercall.h diff --git a/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c b/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c index f7c806e351..d1d65cf4b8 100644 --- a/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c +++ b/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c @@ -303,7 +303,7 @@ int xen_create_contiguous_region( set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, INVALID_P2M_ENTRY); } - if (HYPERVISOR_multicall(cr_mcl, i)) + if (HYPERVISOR_multicall_check(cr_mcl, i, NULL)) BUG(); /* 2. Get a new contiguous memory extent. */ @@ -342,7 +342,7 @@ int xen_create_contiguous_region( cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order ? UVMF_TLB_FLUSH|UVMF_ALL : UVMF_INVLPG|UVMF_ALL; - if (HYPERVISOR_multicall(cr_mcl, i)) + if (HYPERVISOR_multicall_check(cr_mcl, i, NULL)) BUG(); if (success) @@ -400,7 +400,7 @@ void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order) INVALID_P2M_ENTRY); out_frames[i] = (__pa(vstart) >> PAGE_SHIFT) + i; } - if (HYPERVISOR_multicall(cr_mcl, i)) + if (HYPERVISOR_multicall_check(cr_mcl, i, NULL)) BUG(); /* 3. Do the exchange for non-contiguous MFNs. */ @@ -432,7 +432,7 @@ void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order) cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order ? UVMF_TLB_FLUSH|UVMF_ALL : UVMF_INVLPG|UVMF_ALL; - if (HYPERVISOR_multicall(cr_mcl, i)) + if (HYPERVISOR_multicall_check(cr_mcl, i, NULL)) BUG(); balloon_unlock(flags); diff --git a/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c b/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c index 41b1405ff7..bdf7dda07e 100644 --- a/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c +++ b/linux-2.6-xen-sparse/drivers/xen/core/machine_kexec.c @@ -7,7 +7,6 @@ #include #include #include -#include extern void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage *image); diff --git a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c index 17d1daf658..d2abc56fd4 100644 --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c @@ -1511,7 +1511,7 @@ static void netif_release_rx_bufs(struct netfront_info *np) struct sk_buff *skb; unsigned long mfn; int xfer = 0, noxfer = 0, unused = 0; - int id, ref; + int id, ref, rc; if (np->copying_receiver) { WPRINTK("%s: fix me for copying receiver.\n", __FUNCTION__); @@ -1579,7 +1579,9 @@ static void netif_release_rx_bufs(struct netfront_info *np) mcl->args[2] = 0; mcl->args[3] = DOMID_SELF; mcl++; - HYPERVISOR_multicall(np->rx_mcl, mcl - np->rx_mcl); + rc = HYPERVISOR_multicall_check( + np->rx_mcl, mcl - np->rx_mcl, NULL); + BUG_ON(rc); } } diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h index 44b3b7401a..2526d206a1 100644 --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h @@ -238,7 +238,7 @@ HYPERVISOR_memory_op( static inline int HYPERVISOR_multicall( - void *call_list, int nr_calls) + multicall_entry_t *call_list, int nr_calls) { return _hypercall2(int, multicall, call_list, nr_calls); } diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h index b7c7a05cf5..e65d81a8a3 100644 --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h @@ -128,7 +128,7 @@ u64 jiffies_to_st(unsigned long jiffies); #define scrub_pages(_p,_n) ((void)0) #endif -#include +#include #if defined(CONFIG_X86_64) #define MULTI_UVMFLAGS_INDEX 2 diff --git a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h index 712778213d..e7f345b465 100644 --- a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h +++ b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h @@ -55,7 +55,7 @@ extern int running_on_xen; #include #include #include -#include +#include #include #include diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h index 4eb21a9251..0f4aa7f0f2 100644 --- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h @@ -241,7 +241,7 @@ HYPERVISOR_memory_op( static inline int HYPERVISOR_multicall( - void *call_list, int nr_calls) + multicall_entry_t *call_list, int nr_calls) { return _hypercall2(int, multicall, call_list, nr_calls); } diff --git a/linux-2.6-xen-sparse/include/xen/hvm.h b/linux-2.6-xen-sparse/include/xen/hvm.h index 97bb68a329..4ea8887dc3 100644 --- a/linux-2.6-xen-sparse/include/xen/hvm.h +++ b/linux-2.6-xen-sparse/include/xen/hvm.h @@ -3,7 +3,6 @@ #define XEN_HVM_H__ #include -#include static inline unsigned long hvm_get_parameter(int idx) { diff --git a/linux-2.6-xen-sparse/include/xen/hypercall.h b/linux-2.6-xen-sparse/include/xen/hypercall.h new file mode 100644 index 0000000000..decb88392b --- /dev/null +++ b/linux-2.6-xen-sparse/include/xen/hypercall.h @@ -0,0 +1,24 @@ +#ifndef __XEN_HYPERCALL_H__ +#define __XEN_HYPERCALL_H__ + +#include + +static inline int +HYPERVISOR_multicall_check( + multicall_entry_t *call_list, int nr_calls, + const unsigned long *rc_list) +{ + int rc = HYPERVISOR_multicall(call_list, nr_calls); + + if (unlikely(rc < 0)) + return rc; + BUG_ON(rc); + + for ( ; nr_calls > 0; --nr_calls, ++call_list) + if (unlikely(call_list->result != (rc_list ? *rc_list++ : 0))) + return nr_calls; + + return 0; +} + +#endif /* __XEN_HYPERCALL_H__ */ -- 2.30.2